#pragma once
#include <QDateTime>
#include <QList>
#include <QSettings>
#include "KgLogFile.h"
#include "xnserial.h"
#include "comstruct.h"

typedef unsigned short 	UINT16;
typedef unsigned char 	UINT8;
typedef unsigned int 	UINT32;
typedef unsigned long 	UINT64; 

#define APP_VERSION_MAJOR                               3
#define APP_VERSION_MIDDLE                   	        1
#define APP_VERSION_MINOR                               5

#define PUBLISH_DATE                                   "2025-03-12"



#define   VER380_BMS
#define   BMS_IO_MODEL  // CIO io; // CIOModule

//#define  VER381_COMSTRUCT // added 2024-4-30

#define MASTER_VER        // BA通用版本
//#define ND_VER_PROGRAM  // 南都版本
#define HAS_EMER_STOP_STRATEGY  // 有急停策略
#define RES_STRATEGY_COUNT     8  // 备用策略总个数
#define EXT_STRATEGY_COUNT     10 // 新增策略总个数


#define RUN_LOG_MODBUS_DEV           190  //设备 modbus 报文
#define RUN_LOG_MESSAGE_DEV          200  //设备 操作报文
#define RUN_LOG_FAILED_DEV           210  //设备 操作失败报文?
#define MAX_IODEV_COUNT              1    // IO模块总个数

//电池组信息
typedef struct BattGroupPara
{
    QString       devType;         //设备类型
    QString       devInstCode;     //电池组所在BA设备实例号
    unsigned int  modbusAddr;      //modbus地址
    unsigned long batCnt;          //电池节数
    unsigned long tempCnt;         //温度个数
}BattGroupPara;

//电池堆信息
typedef struct BattStackPara
{
    QString       devType;     //设备类型
    QString       devInstCode; //电池堆实例号
    unsigned int  modbusAddr;  //modbus地址
    unsigned int  groupCount;  //电池组数，堆不算在内
}BattStackPara;

// added 2020-8-27
// DI配置策略
typedef struct
{
    unsigned int		diIndex;   // DI索引，从0开始编号
    unsigned int		iStrategy; // 1:汇流开关反馈 9:消防采集干结点
}DIStrategy;

// DO配置策略
typedef struct
{
    unsigned int		doIndex;   // DO索引，从0开始编号
    unsigned int		iStrategy; /* 1:故障灯或故障干结点; 2:禁充干结点; 3:禁放干结点;
    9:消防动作干结点; 101:汇流开关合闸干结点 102:汇流开关分闸干结点 */
}DOStrategy;



typedef struct
{
    unsigned int  diIndex;     // DI索引，从0开始编号
    unsigned char alarmValue;  // 1表示常开信号，为1时（闭合时)表示发生告警  0表示常闭信号，为0时（断开时)表示发生告警
    unsigned int  iStrategy;   //
    QString  diName;     // 告警名称
    QString  diOverName; // 告警结束名称
}DI_STU;

// 消防配置策略 防雷配置策略 急停配置策略
typedef struct
{
    QList<DI_STU>	    diList;     // 采集DI列表
    QList<DOStrategy>	xfCtrlList; // 动作干结点列表
    int  confirmedCount;            // 告警确认次数
    int iNeedBreak;                 // 是否需要跳机
    QString             diName;     // 告警名称 2025-02-12
    QString             diOverName; // 告警结束名称
}XFStrategy;

// modified 2021-09-19 加入检测多个反馈，如亿纬尼日尔630A，是一个DO口同时去控制两个断路器脱扣
// modified 2021-10-07 加入控制多个断路器分励脱扣，如平高大庆项目，是同时去控制两个DO口分励脱扣
// 汇流开关配置策略
typedef struct
{
    //unsigned int		diIndex;   // 汇流开关反馈DI索引，从0开始编号
    QList<DI_STU>		diCfgList; // 汇流开关反馈DI索引，从0开始编号 // modified 2021-06-22 加入判断常开常闭(娄底项目为常闭)
    QList<int>	        hzDoList; // 合闸DO索引，从0开始编号
    QList<int>	        fzDoList; // 故障时分闸DO索引，从0开始编号

    QList<int>          xfTkDoList;// 消防脱扣干结点
    QList<int>          xfSprayTkDoList;// 消防喷洒脱扣干结点  // added 2022-12-10
    QList<int>	        volDownProtFzDoList; // 低电压保护时分闸DO索引，从0开始编号 // added 2022-1-15
}HLKGStrategy;
//add end

//干结点信息
typedef struct _DryData
{
    //int dbModbusAddr;
    //int devAddr;

    int  zz404D_addr;     // 4路继电器输出4路开关量输入 设备地址
    int  diStartRegAddr;  // DI起始寄存器地址
    int  doStartRegAddr;  // DO起始寄存器地址
    int  devDoCount;	  // ZZ-IO的输出干结点总个数
    int  devDiCount;	  // ZZ-IO的输入干结点总个数
    float tkDelayTime;	  // 控制合闸分闸时，延时时间，单位：秒
    float rwTimeoutSec;   // IO模块读写超时时间，单位：秒 //added 2022-1-11

    quint16 failedCount;// 通信失败次数
    quint16 readDiCount;// 读取到DI次数

    quint16 IOCtrl;    // 读取到DO值
    quint16 DIVal;     // 读取到DI值
    quint16 usErrorLen;// 错误报文长度 added 2023-11-17
    char errorBuf[50]; // 错误报文

}DryData;

typedef struct
{
    quint16 usExtPCSDry1Type;               // 类型 0 - 未配置 1 - 告警 2 - 保护  3 - 禁充 4 - 禁放
    quint16 usExtPCSDry1DONo;               // DO序号 1 或者 2
    quint16 usExtPCSDry1AlarmValue;         // 告警值
}PCSDryNode;

typedef struct
{
    quint16 usExIOCommSerialPortNo;         // 扩展IO模块通讯串口号 // added 2023-1-9

    quint16 usFaultLampCtrlDONo;            // 故障灯控制  1 ~ 5, DO1 ~ DO5
    quint16 usRunLampCtrlDONo;              // 运行灯控制  1 ~ 5, DO1 ~ DO5
    quint16 usExtFaultLampCtrlDONo;         // 扩展故障灯控制   201 ~ 208 - 扩展IO
    quint16 usExtRunLampCtrlDONo;           // 扩展运行灯控制   201 ~ 208 - 扩展IO
    quint16 usConfSwitchOnCtrlDONo;         // 汇流开关合闸控制 201 ~ 208 - 扩展IO
    quint16 usConfSwitchOffCtrlDONo;        // 汇流开关分闸控制 201 ~ 208 - 扩展IO

    quint16 usExtPCSDry1Type;               // 类型 0 - 未配置 1 - 告警 2 - 保护  3 - 禁充 4 - 禁放
    quint16 usExtPCSDry1DONo;               // DO序号 1 或者 2
    quint16 usExtPCSDry1AlarmValue;         // 告警值
    quint16 usExtPCSDry2Type;               // 类型 0 - 未配置 1 - 告警 2 - 保护  3 - 禁充 4 - 禁放
    quint16 usExtPCSDry2DONo;               // DO序号
    quint16 usExtPCSDry2AlarmValue;         // 告警值

    quint16 usConfSwitchStrategy;           // 汇流开关策略    1 - BC 2- BA 3 - ExtIO
    quint16 usConfSwitchDINo;               // DI序号
    quint16 usConfSwitchAlarmValue;         // 告警值
    quint16 usLastConfSwitchState;          // 汇流开关汇上次状态       0 - 默认  1 - 闭合  2 - 断开
    quint16 usConfSwitchState;              // 汇流开关汇状态           0 - 默认  1 - 闭合  2 - 断开

    quint16 usEmerStopStrategy;             // 紧急停机策略     1 - BC 2- BA 3 - ExtIO
    quint16 usEmerStopDINo;                 // DI序号
    quint16 usEmerStopAlarmValue;           // 告警值
    quint16 usLastEmerStopState;            // 紧急停机上次状态         0 - 默认  1 - 告警  2 - 正常
    quint16 usEmerStopState;                // 紧急停机状态             0 - 默认  1 - 告警  2 - 正常

    quint16 usFireWarnStrategy;             // 消防预警策略     1 - BC 2- BA 3 - ExtIO
    quint16 usFireWarnDINo;                 // DI序号
    quint16 usFireWarnAlarmValue;           // 告警值

    quint16 usFireActionStrategy;           // 消防启动策略     1 - BC 2- BA 3 - ExtIO
    quint16 usFireActionDINo;               // DI序号
    quint16 usFireActionAlarmValue;         // 告警值

    quint16 usFireFaultStrategy;            // 消防故障策略     1 - BC 2- BA 3 - ExtIO
    quint16 usFireFaultDINo;                // DI序号
    quint16 usFireFaultAlarmValue;          // 告警值

    quint16 usWaterStrategy;                // 水浸告警策略     1 - BC 2- BA 3 - ExtIO
    quint16 usWaterDINo;                    // DI序号
    quint16 usWaterAlarmValue;              // 告警值

    quint16 usGasStrategy;                  // 可燃气体策略     1 - BC 2- BA 3 - ExtIO
    quint16 usGasDINo;                      // DI序号
    quint16 usGasAlarmValue;                // 告警值

    quint16 usAcceCtrlStrategy;             // 门禁状态策略     1 - BC 2- BA 3 - ExtIO
    quint16 usAcceCtrlDINo;                 // DI序号
    quint16 usAcceCtrlAlarmValue;           // 告警值
}DryDIDOConfig;

#ifdef BMS_IO_MODEL
// 屏上IO模块 // added 2023-11-11
typedef struct CIOModule
{
    quint16 usCommState;      // 通讯状态 0 - 通信正常   1 - 通信故障
    quint16 usDI[16];
    quint16 usDOState[12];    // 干接点1状态
    quint16 usDOCtrl[12];     // 干接点1控制
}CIOModule;
#endif

class CRTDB;
class DryCtrlThread;
class KgGlobalData
{
public:
    KgGlobalData(void);
    ~KgGlobalData(void);
    static int readConfig();     //读取参数配置
    static int InitRtdb();         //初始化Rtdb
    
    static  QString ms_comDevName;   // BA与串口继电器通信接口，默认为:ttySAC2
    static  int  ms_hardwareOemID;   // 硬件设备型号  1-大屏旧屏 2-小屏新屏
    static  int  ms_zz404D_addr;     // 4路继电器输出4路开关量输入 设备地址
    static  int  ms_devNo;           // 设备编号(从1开始编号)
    static  int  ms_hzEnabled;       // 是否使能合闸
    static  int  ms_faultTkEnabled;  // 故障时是否脱扣高压箱断路器
    static  int  ms_emgTkEnabled;    // 急停脱扣是否使能 added 2023-12-14
    static  int  ms_waterTkEnabled;
    static  int  ms_confSwitchEnabled;// 汇流开关是否显示 added 2023-12-14
    static  int  ms_execFltkFirst;    // 分励脱扣是否优先执行
    static  int  ms_xfWarnFzEnabled; // 是否使能消防预警就分闸
    static  int  ms_xfAlarmFzEnabled;// 是否使能消防告警就分闸 added 2024-4-27
    static  int  ms_waterAlarmFzEnabled;// 是否使能水浸告警就分闸
    static  int  ms_ctrlConfSwitchCount;// 先执行分励脱扣次数
    static  int  ms_diStartRegAddr;  // DI起始寄存器地址
    static  int  ms_doStartRegAddr;  // DO起始寄存器地址

    static  int  ms_isGaoTeVer;     // 是否为高特版 added 2023-7-28
    static  int  ms_enabled485Alarm;// 485消防告警等是否使能 // 2024-1-6

    // added 2020-8-27
    static  int  ms_devDoCountBak;	// ZZ-IO的输出干结点总个数  (从配置文件读取) // added 2023-01-06
    static  int  ms_devDiCountBak;	// ZZ-IO的输入干结点总个数  (从配置文件读取)
    static  int  ms_devDoCount;		 // ZZ-IO的输出干结点总个数 (根据界面用户配置动态调整)
    static  int  ms_devDiCount;		 // ZZ-IO的输入干结点总个数 (根据界面用户配置动态调整)
    static  int  ms_bcDiCount;       // added 2024-8-28
    static  int  ms_bcDoCount;       // added 2024-9-29
    static  float ms_tkDelayTime;	 // 控制合闸分闸时，延时时间，单位：秒
    static  float ms_rwTimeoutSec;   // IO模块读写超时时间，单位：秒 //added 2022-1-11
    static 	int	 ms_saveHlkgLog;	 // 保存汇流开关状态改变日志
    static  int ms_isSaveDetaiLog;   // 是否输出详细日志
    static  int ms_bXfWarnTellBmsed; // 消防预警是否通知BMS面 // added 2024-3-1

    static  QList<int> ms_diAlarmVals;
    static  QList<int> ms_usedDoList;
    static  QList<int> ms_usedDiList;
    static	QList<DOStrategy>	 ms_gzCtrlList;   // 故障动作干结点列表
    static	QList<DOStrategy>	 ms_gzHzCtrlList; // 故障汇总干结点列表 2025-2-20
    static	QList<DOStrategy>	 ms_alarmCtrlList;// 告警干结点列表
    static	QList<DOStrategy>	 ms_phbChgList;   // 禁充干结点列表
    static	QList<DOStrategy>	 ms_phbDischgList;// 禁放干结点列表
    static	QList<DOStrategy>	 ms_runCtrlList;  // 运行干结点列表
    static	QList<DOStrategy>	 ms_allLightCtrlList;  // 常亮灯列表
    static	QList<DOStrategy>	 ms_chgDriveList; // 充电驱动干结点列表 // added 2021-9-9
    static	QList<DOStrategy>	 ms_dchgDriveList;// 放电驱动干结点列表
    static	QList<DOStrategy>	 ms_bmsEmsCommFaultList;// BMS-EMS通信故障干结点列表 // added 2022-7-11
    static	QList<DOStrategy>	 ms_emgCtrlList;   // 急停干结点列表
    static	QList<DOStrategy>	 ms_fanDriveList;  // 风扇驱动干结点列表
    static	QList<DOStrategy>	 ms_tempDriveList; // 温控驱动干结点列表// added 2024-4-26
    static	QList<DOStrategy>	 ms_smokeOrHeatDriveList; // 温感或烟感驱动干结点列表// added 2025-2-10
    static	QList<DOStrategy>	 ms_smokeAndHeatDriveList;// 温感且烟感驱动干结点列表
    static	QList<DOStrategy>	 ms_keepRegCtrlDriveList;
    static  QList<DOStrategy>    ms_allocAddressList;       //分配地址的列表
    //static	QList<DOStrategy>	 ms_xfTkDriveList;// 消防脱扣干结点列表
    static  int 				 ms_diIndexChgDrive; // 充电接触器反馈
    static  int                  ms_diIndexDchgDrive;// 放电接触器反馈


    static  XFStrategy			 ms_xfStrategy;	    // 消防配置策略
    static  XFStrategy			 ms_xfSprayStrategy;// 消防喷洒配置策略 // added 2022-12-10
    static  XFStrategy			 ms_xfFaultStrategy;// 消防故障配置策略 // added 2022-12-21
    static  XFStrategy			 ms_xfManuAutoStrategy; // 消防手动/自动配置策略 // added 2023-11-9
    static  XFStrategy			 ms_elecPowerOffStrategy; // 市电断电 // added 2023-11-9
    static  XFStrategy			 ms_waterStrategy;  // 水浸配置策略
    static  XFStrategy		     ms_tdStrategy;	    // 防雷配置策略
    static  XFStrategy           ms_emgStopStrategy;// 急停配置策略
    static  XFStrategy			 ms_waterStrategySec;  // #2水浸配置策略
    static  XFStrategy		     ms_tdStrategySec;	   // #2防雷配置策略
    static  XFStrategy           ms_emgStopStrategySec;// #2急停配置策略
    static  XFStrategy           ms_bmsLocalStrategy; // BMS就地配置策略
    static  XFStrategy           ms_bmsRemmoteStrategy;// BMS远方配置策略
    static  XFStrategy           ms_acFaultStrategy;   // 空调机组故障策略
    static  XFStrategy           ms_lqFaultStrategy;   //液冷机组故障策略
    static  XFStrategy           ms_bmsSmokeStrategy;   //烟感策略
    static  XFStrategy           ms_heatSenseStrategy;  //温感策略

    static  XFStrategy           ms_combusGasStrategy;// 可燃气体配置策略 combustible gas  //added 2021-12-7
    static  XFStrategy           ms_fuseStrategy;     // 熔断器配置策略   // added 2022-3-27
    static  XFStrategy           ms_xfMotionStrategy; // 消防释放配置策略 // added 2022-4-6
    static  XFStrategy           ms_xfWarmStrategy;   // 消防预警配置策略 // added 2022-6-8

    static  XFStrategy           ms_upsAlmStrategy;    // UPS告警配置策略 // added 2022-11-8
    static  XFStrategy           ms_doorAlmStrategy;   // 门禁告警配置策略 // added 2022-11-8
    static  XFStrategy           ms_doorAlmStrategySec; // 门禁告警配置策略 //added 2023-5-4

    static  XFStrategy			 ms_resStrategy[RES_STRATEGY_COUNT];     // 备用策略 // added 2023-8-19
    static  XFStrategy           ms_extStrategy[EXT_STRATEGY_COUNT];

    static 	HLKGStrategy		 ms_hlkgStrategy;     // 汇流开关配置策略
    static  XFStrategy           ms_isolSwitchStrategy;// 隔离开关策略
    static  XFStrategy           ms_mainSwitchStrategy;// 主断路器(手动操作)策略
    static  int                  ms_connTimeoutCount; // 通迅故障确认次数
    static  QList<DI_STU>        ms_bcDiList;
    static  QList<DOStrategy>    ms_bcDoList;
    static  int                  ms_textCode; // 配置文件文本编码          1-ANSI格式    2-UTF-8格式
    // added end

    static  CRTDB *ms_pRTDB;
    static  CBattStack *ms_pStack;
    static  CIOModule *ms_pIOModule;

    static QString m_strDriver;      // DB Information
    static QString m_strIP;
    static ushort m_usPort;
    static QString m_strDBName;
    static QString m_strUserName;
    static QString m_strPwd;

    static int    ms_openFanTemp;
    static unsigned int  ms_keepRegCtrlPos;

    static  int ms_installBankNum;//电池组总数
    static  int ms_bankNumInStack;// 堆管辖的电池组总数
    //static 	QList<BattGroupPara> ms_batGroupList;//电池组参数列表
    //static 	QList<BattStackPara> ms_batStackList;//电池堆参数列表

    static DryData ms_dryData;
    static DryData ms_drySecData;

    static int ms_isOutputLog;      // 是否输出日志 1：输出   其他值：不输出
    //static KgLogFile ms_logFile;
    static DryCtrlThread* ms_dryThd;

    static QString ms_IOConfigStr;        // added 2022-5-22
    static DryDIDOConfig ms_oldDiDoSet;   // added 2023-01-05
    //static int ms_hasUpsDryNode;        // added 2022-11-5

    static int ms_closeFanDelayTime;      // added 2024-1-31
    static int ms_minChgDchgCur;          // 最小充放电电流 // added 2024-2-5

    static KgLogFile ms_logFile;
    static KgLogFile ms_bclogFile;
};

void   writeKgLogfile(QString strInfo, bool bSaveToFile=false);
void   writeKgBcLogfile(QString strInfo, bool bSaveToFile=false);

UINT16 Modbus_CRC16(UINT8 *dat_buf,UINT16 dat_len);
void   getCurrentTime(int &year, int &month, int &day, int &h, int &m, int &s, int &msec);
int    NeedBreakJCQCount();        //获取需要断开接触器的电组池总组数 2019-10-12
int    NeedCloseJCQCount();        //获取需要闭合接触器的电组池总组数 2019-11-28
int    GetClosedJCQCount();		//获取正负接触器都闭合的电池组数 2020-5-5
int    GetOpenedJCQCount();//获取正负接触器都断开的电池组数 2020-5-19
void   SetBamsFireAlarm (char alarm); //通知消防告警到BAMS，BA运行状态由正常转为跳机，各组状态切换到开路
void   SetBamsWaterAlarm(char waterAlarm);//通知水浸告警到BAMS
void   SetFuseAlarm(char alarm);
void   SetIsolSwitchAggrState (char state);// 设置隔离开关状态 2021-5-27
void   SetEmergeStopAlarm(char alarm);// 通知BA紧急停机 2020-12-23
void   updateDryDataToRtdb(DryCtrlThread *pThread); // 更新DI1-4数据到BA的通用保持寄存器50-53中 2020-1-15
int    ExecDbQuery(QString strSql, QString &strError);//执行sql语句
void   saveFireAlarmToDb(int fireBankNo, int fireBoxNo);
void   updateAlarmOverToDb();
void   saveLogToBaDb(QString strLog);
void   saveBcLogToBaDb(QString strLog);
int	   isBankInStack(int bankNo);//  判断电池组是否参与运算//added 2020-6-12
void   keepContCtrlOpened(int stackState, int hlkgState); // 汇流开关闭合且接触器断开时，控制接触器保持断开状态，不准闭合，直到汇流开关断开
int    isChLang();
int    isBankAlarm();      // 0：正常 1：报警 //added 2021-5-30
bool   hasVolDownPort(); // 有电压欠压保护 //added 2022-01-15
void   openDos(quint16 &IOCtrl, QList<int> doList);// 控制DO闭合 //added 2021-1-16
void   closeDos(quint16 &IOCtrl, QList<int> doList);// 控制DO断开
void   getInstallInfo(); // 获取安装组数 // added 2022-3-8
int    isBoxVolTempDiffAlarm(); // 有箱压差// added 2022-7-5
void   readFileDIDOConfig();  // 读取配置文件中的DIDO配置 // added 2023-01-05
void   readUserDIDOConfig(); // 读取用户配置DIDO信息    // added 2022-12-31
void   updateConfSwitchStrategy(int iStrategy);// 配置汇流开关策略 added 2023-9-15
QString parseDIName(QString strUtf8);
QString getAppVer();

bool   reloadDIDOConfig();     // 如果用户配置DIDO有变化，则重新加载 // added 2023-01-05
bool   detectConfigChanged();// 检查用户配置DIDO是否有变化         // added 2023-01-05
void   clearDIDOInfo();          // 清除老的DIDO信息                   // added 2023-01-05
void   printDiDoState();
CIOModule * getIOModule();
QString kgConvert(char *str);

quint16 getUint16(float fVal);
float getRealVal(quint16 uVal, float rate);

bool isFaultTkEnabled(CBattBank *pBank);
bool isEmgTkEnabled();
bool isWaterTkEnabled();


